﻿using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace ImageProcesser
{
    public class Program
    {
        /// <summary>
        /// 将图片中纯白（255,255,255）的像素透明化并保存
        /// </summary>
        /// <param name="inputPath">输入图片路径</param>
        /// <param name="outputPath">输出图片路径（建议使用 .png 格式）</param>
        public static void MakeWhiteTransparent(string inputPath, string outputPath)
        {
            // 加载原始图片
            using (Bitmap originalImage = new Bitmap(inputPath))
            {
                // 确保图片支持 Alpha 通道（32位 ARGB）
                Bitmap processedImage = ConvertToArgbFormat(originalImage);

                // 锁定像素数据（直接操作内存）
                Rectangle rect = new Rectangle(0, 0, processedImage.Width, processedImage.Height);
                BitmapData bmpData = processedImage.LockBits(rect, ImageLockMode.ReadWrite, processedImage.PixelFormat);

                try
                {
                    // 获取像素数据的字节数组指针
                    IntPtr ptr = bmpData.Scan0;
                    int bytes = Math.Abs(bmpData.Stride) * processedImage.Height; // 总字节数
                    byte[] pixelBytes = new byte[bytes];

                    // 将内存中的像素数据复制到字节数组
                    System.Runtime.InteropServices.Marshal.Copy(ptr, pixelBytes, 0, bytes);

                    // 遍历每个像素（按行处理）
                    for (int y = 0; y < processedImage.Height; y++)
                    {
                        for (int x = 0; x < processedImage.Width; x++)
                        {
                            // 计算当前像素在数组中的索引（32位 ARGB 格式：每个像素占4字节）
                            int index = (y * bmpData.Stride) + (x * 4);

                            // 提取 R、G、B 分量（注意：BGR 顺序，非 RGB）
                            byte blue = pixelBytes[index];
                            byte green = pixelBytes[index + 1];
                            byte red = pixelBytes[index + 2];

                            // 判断是否为纯白（255,255,255）
                            if (red == 255 && green == 255 && blue == 255)
                            {
                                // 设置 Alpha 为 0（完全透明）
                                pixelBytes[index + 3] = 0;
                            }
                        }
                    }

                    // 将修改后的字节数组复制回内存
                    System.Runtime.InteropServices.Marshal.Copy(pixelBytes, 0, ptr, bytes);
                }
                finally
                {
                    // 解锁像素数据
                    processedImage.UnlockBits(bmpData);
                }

                // 保存处理后的图片（使用 PNG 格式保留透明度）
                processedImage.Save(outputPath, ImageFormat.Png);
            }
        }

        /// <summary>
        /// 将图片转换为 32位 ARGB 格式（支持透明度）
        /// </summary>
        private static Bitmap ConvertToArgbFormat(Bitmap image)
        {
            // 若原图已支持 ARGB，直接返回
            if (image.PixelFormat == PixelFormat.Format32bppArgb)
                return new Bitmap(image);

            // 否则转换为 32位 ARGB 格式
            Bitmap argbImage = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(argbImage))
            {
                g.DrawImage(image, 0, 0); // 绘制原图到新图（自动处理格式转换）
            }
            return argbImage;
        }

        // 示例用法
        public static void Main()
        {
            try
            {
                // 输入图片路径（支持 JPG、PNG 等格式）
                string input = "ZSLOGO.jpg";
                // 输出图片路径（必须使用 PNG 格式以保留透明度）
                string output = "ZSLOGOt.jpg";

                MakeWhiteTransparent(input, output);
                Console.WriteLine("图片处理完成！");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"处理失败：{ex.Message}");
            }
        }
    }
}
